// 对localStorage以及sessionStorage的封装
import storage from 'good-storage'

const SEARCH_KEY = '__search__'
const SEARCH_MAX_LEN = 15

const PLAY_KEY = '__play__'
const PLAY_MAX_LEN = 200

const FAVORITE_KEY = '__favorite__'
const FAVORITE_MAX_LEN = 200

// 插入到数组的最前面（数组，值，比较函数，最大长度）
function insertArray(arr, val, compare, maxLen) {
  // 查找当前数组数组中是否存findIndex在某一个元素
  const index = arr.findIndex(compare)
  // 第一条数据 则什么也不做
  if (index === 0) {
    return
  }
  // 这个数组数组中包含这个元素并且不zai第一位则删除该元素
  if (index > 0) {
    arr.splice(index, 1)
  }
  // 然后插入到数组的第一个位置
  arr.unshift(val)
  // 如果有长度限制，当前数组长度大于定义的长度则弹出末尾元素
  if (maxLen && arr.length > maxLen) {
    arr.pop()
  }
}
// 对删除列表的元素进行数据处理（数组，比较函数）
function deleteFromArray(arr, compare) {
  const index = arr.findIndex(compare)
  if (index > -1) {
    arr.splice(index, 1)
  }
}
// 保存搜索的数据
export function saveSearch(query) {
  // 没有存数据的话就是一个空数组
  let searches = storage.get(SEARCH_KEY, [])
  // 插入的放在数组前面
  insertArray(searches, query, (item) => {
    return item === query
  }, SEARCH_MAX_LEN)
  // 存入
  storage.set(SEARCH_KEY, searches)
  // 新的数组return出去
  return searches
}
// 删除单条搜索的结果
export function deleteSearch(query) {
  // 先获取搜索列表
  let searches = storage.get(SEARCH_KEY, [])
  deleteFromArray(searches, (item) => {
    return item === query
  })
  // 保存删除之后的数组
  storage.set(SEARCH_KEY, searches)
  return searches
}
// 删除所有搜索历史
export function clearSearch() {
  storage.remove(SEARCH_KEY)
  return []
}

export function loadSearch() {
  return storage.get(SEARCH_KEY, [])
}
// 保存播放列表
export function savePlay(song) {
  let songs = storage.get(PLAY_KEY, [])
  insertArray(songs, song, (item) => {
    return song.id === item.id
  }, PLAY_MAX_LEN)
  // 新的数组缓存在本地
  storage.set(PLAY_KEY, songs)
  return songs
}
// 读取
export function loadPlay() {
  return storage.get(PLAY_KEY, [])
}

export function saveFavorite(song) {
  let songs = storage.get(FAVORITE_KEY, [])
  insertArray(songs, song, (item) => {
    return song.id === item.id
  }, FAVORITE_MAX_LEN)
  storage.set(FAVORITE_KEY, songs)
  return songs
}

export function deleteFavorite(song) {
  let songs = storage.get(FAVORITE_KEY, [])
  deleteFromArray(songs, (item) => {
    return item.id === song.id
  })
  storage.set(FAVORITE_KEY, songs)
  return songs
}

export function loadFavorite() {
  return storage.get(FAVORITE_KEY, [])
}

